import {
  take,
  put,
} from '../../redux-saga/effects'

// 获取 action 动作对象类型
import * as types from '../action.types'

/**
 * 等待 time 时间后返回一个成功的 promise
 */
function delay(time) {
  return new Promise(resolve => setTimeout(resolve, time))
}

/**
 * worker saga 用于做具体的事件
 */
function* workerSaga() {
  yield delay(1000) // 执行 delay 方法
  yield put({type: types.ADD}) // 同步 dispatch 派发一个 action
}

/**
 * watcherSaga 用于监听 dispatch 派发动作来决定执行 worker saga
 * 监听 redux 中 dispatch 调用时的 action 派发的动作
 */
function* watcherSaga() {
  // 调用 take 产出一个 effect 等待 dispatch 调用时派发一个 types.ASYNCADD 类型的动作
  // 如果没有监听到则 saga 会停在这个地方
  // 如果监听到了就 执行 worker saga
  yield take(types.ASYNC_ADD)
  yield workerSaga() // 然后执行 worker saga
}

/**
 * 根 saga\
 * 内部会使用 watcherSaga 监听 dispatch 派发的动作
 */
function* rootSaga() {
  yield watcherSaga()
}

export default rootSaga
